package org.huoran.sakamichi.main.activemq.producer;

import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.pool.PooledConnectionFactory;
import org.springframework.jms.core.JmsTemplate;

import javax.annotation.Resource;
import javax.jms.DeliveryMode;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class ProxyMessageTemplate {

    // 消息模板集合
    public static final Map<String, JmsTemplate> JSM_TEMPLATE_CACHE = new ConcurrentHashMap<>();
    // 消息队列连接池
    @Resource
    private PooledConnectionFactory activeMqPooled;

    /**
     * 初始化消息模板
     * @param topicName 主题或队列名称
     * @param deliveryMode 是否持久化发送消息 默认false
     * @param type 消息类型
     * @return
     */
    private JmsTemplate initJmsTemplate(String topicName, boolean deliveryMode, MessageType type) {
        //已有话题或者队列直接返回
        if (null != JSM_TEMPLATE_CACHE.get(topicName)) {
            return JSM_TEMPLATE_CACHE.get(topicName);
        }

        JmsTemplate template = new JmsTemplate();
        //注入连接工厂
        template.setConnectionFactory(activeMqPooled);
        //消息队列
        if (type == MessageType.QUEUE) {
            // 配置发送目的地
            template.setDefaultDestination(new ActiveMQQueue(topicName));
        }
        //消息话题
        else {
            // 配置发送目的地
            template.setDefaultDestination(new ActiveMQTopic(topicName));
            // 设置为订阅模式
            template.setPubSubDomain(true);
        }
        //启用服务质量处理(否则：deliveryMode, priority, 和 timeToLive 不起作用)
        template.setExplicitQosEnabled(true);
        //是否持久化消息
        if (deliveryMode) {
            template.setDeliveryMode(DeliveryMode.PERSISTENT);
        } else {
            template.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        }
        JSM_TEMPLATE_CACHE.put(topicName, template);
        return template;
    }

    /**
     * 发送消息
     * @param queueName 队列名称
     * @param deliveryMode 是否持久化发送消息 默认false
     * @param type 消息类型
     * @return
     */
    public boolean sendMessage(String queueName, boolean deliveryMode, MessageType type, String message) {
        boolean result = true;
        try {
            JmsTemplate jmsTemplate = initJmsTemplate(queueName, deliveryMode, type);
            jmsTemplate.convertAndSend(message);
        } catch (Exception e) {
            e.printStackTrace();
            result = false;
        }
        return result;
    }

    public boolean sendMessage(String queueName, String message) {
        boolean result = true;
        try {
            JmsTemplate jmsTemplate = initJmsTemplate(queueName, true, MessageType.QUEUE);
            jmsTemplate.convertAndSend(message);
        } catch (Exception e) {
            e.printStackTrace();
            result = false;
        }
        return result;
    }

}
